题目描述
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
plaintext
1 | 输入:n = 12 |
示例 2:
plaintext
1 | 输入:n = 13 |
限制:
- 1<=n<231
注意:本题与主站 233 题相同:https://leetcode-cn.com/problems/number-of-digit-one/
算法
(数位统计) O(log10n)
分情况讨论
假设当前枚举到了第 i 位,left 表示 i 左边数字,right 表示 i 右边数字
- 左边数字是 0 ~ (ab - 1),出现次数 ab * t(假设当前枚举位右边数字的位数为 x,则 t=10x
- 左边数字是 ab
2.1 当前位是 0,不做处理
2.2 当前位是 1,出现次数 right + 1
2.3 当前位大于 1,出现次数 t
时间复杂度
两次循环枚举每一位,所以时间复杂度为 O(log10n)。
空间复杂度
O(1)
C++ 代码
cpp
1 | class Solution { |